﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusAdaptorStep.h
 * @brief  Abaqus HDF5 Step 适配器 用于读取HDF5过程中的Step解析。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-06-06
 *
 *********************************************************************/
#ifndef __FITKABAQUSHDF5ADAPTORSTEP__H__
#define __FITKABAQUSHDF5ADAPTORSTEP__H__

#include "FITKAbaqusIOHDF5API.h"
#include "FITKAbaqusHDF5AbstractAdaptor.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"
#include "FITK_Interface/FITKInterfaceIOHDF5/FITKAbstractHDF5Adaptor.h"

 //前置声明
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaStepManager)
ForwardDeclarNS(Interface, FITKAbaAbstractStep)
ForwardDeclarNS(Interface, FITKAbaStepInit)
ForwardDeclarNS(Interface, FITKAbaStepFrequency)
ForwardDeclarNS(Interface, FITKAbaStepGeneralStatic)
ForwardDeclarNS(Interface, FITKAbaStepDynamicExplicit)
ForwardDeclarNS(Interface, FITKAbaAbstractLoad)
ForwardDeclarNS(Interface, FITKAbaAbstractBoundaryCondition)
ForwardDeclarNS(Interface, FITKAbaAbstractOutput)
ForwardDeclarNS(Interface, FITKAbaFieldOutputManager)
ForwardDeclarNS(Interface, FITKAbaHistoryOutputManager)
ForwardDeclarNS(Interface, FITKBoundaryLocation)

namespace IO
{
    /**
     * @brief Abaqus HDF5 Step 读写适配器
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-06-06
     */
    class FITKABAQUSIOHDF5API FITKAbaqusHDF5AdaptorStep : public FITKAbstractHDF5Adaptor
    {
    public:
        explicit FITKAbaqusHDF5AdaptorStep() = default;
        ~FITKAbaqusHDF5AdaptorStep() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-06
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置算例数据对象
         * @param caseData 算例数据对象
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-06
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-06
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-06
         */
        bool adaptW() override;

        /**
         * @brief 读取分析类型
         * @param step 分析步
         * @param h5Group 数据块
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-14
         */
        bool readStep(Interface::FITKAbaAbstractStep* step, H5::Group& h5Group);

        /**
         * @brief 读取静态分析类型
         * @param step 分析步
         * @param h5Group 数据块
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-14
         */
        bool readStatic(Interface::FITKAbaAbstractStep* step, H5::Group& h5Group);

        /**
         * @brief 读取动态分析类型
         * @param step 分析步
         * @param h5Group 数据块
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-14
         */
        bool readDynamic(Interface::FITKAbaAbstractStep* step, H5::Group& h5Group);

        /**
         * @brief 读取频率分析类型
         * @param step 分析步
         * @param h5Group 数据块
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-14
         */
        bool readFrequency(Interface::FITKAbaAbstractStep* step, H5::Group& h5Group);

        /**
         * @brief 写出分析类型
         * @param step 分析步
         * @param h5Group 数据块
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-14
         */
        bool writeStep(Interface::FITKAbaAbstractStep* step, H5::Group& h5Group);

        /**
         * @brief 写出静态分析类型
         * @param step 分析步
         * @param h5Group 数据块
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-06
         */
        bool writeStatic(Interface::FITKAbaAbstractStep* step, H5::Group& h5Group);

        /**
         * @brief 写出动态分析类型
         * @param step 分析步
         * @param h5Group 数据块
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-06
         */
        bool writeDynamic(Interface::FITKAbaAbstractStep* step, H5::Group& h5Group);

        /**
         * @brief 写出频率分析类型
         * @param step 分析步
         * @param h5Group 数据块
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-06
         */
        bool writeFrequency(Interface::FITKAbaAbstractStep* step, H5::Group& h5Group);

        /**
         * @brief 读取分析步中的边界(Boundary)位置
         * @param boundLocation 边界位置
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-07-03
         */
        bool readBoundaryLocation(Interface::FITKBoundaryLocation* boundLocation, H5::Group& h5Group);

        /**
         * @brief 写出分析步中的边界(Boundary)位置
         * @param boundLocation 边界位置
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-07-03
         */
        bool writeBoundaryLocation(Interface::FITKBoundaryLocation* boundLocation, H5::Group& h5Group);

        /**
         * @brief 写出分析步中的相互作用(Interaction)条件
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-06-06
         */
        bool writeInteraction();

        /**
         * @brief 写出载荷
         * @return 状态 true 正确 false 失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-06
         */
        bool writeLoad();

    };

    Register2FITKIOAdaptorFactory(HDF5, Interface::FITKAbaAbstractStep, FITKAbaqusHDF5AdaptorStep)
}

#endif
